/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package jpa.controller;

import general.util.MyStringUtil;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.NoResultException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import jpa.controller.exceptions.NonexistentEntityException;
import jpa.entity.Produto;

/**
 *
 * @author isaias
 */
public class ProdutoJpaController {

    public ProdutoJpaController() {
        emf = Persistence.createEntityManagerFactory("ProjectObraPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Produto produto) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(produto);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Produto produto) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            produto = em.merge(produto);
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Long id = produto.getId();
                if (findProduto(id) == null) {
                    throw new NonexistentEntityException("The produto with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Long id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Produto produto;
            try {
                produto = em.getReference(Produto.class, id);
                produto.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The produto with id " + id + " no longer exists.", enfe);
            }
            em.remove(produto);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

      public Produto findProdutoByName(String nameFilter, Produto produto) {
            String sql = "SELECT p FROM Produto p WHERE p.name LIKE :name ";
             
              if(produto.getMarca() != null && produto.getMarca().getId() != null){
                sql += " AND p.marca.id = :idMarca  ";
              }
              
              if(produto.getDetalhe() != null && produto.getDetalhe().getId() != null){
                  sql += " AND p.detalhe.id = :idDetalhe";
              }
              
            Query query = getEntityManager().createQuery(sql);

            query.setParameter("name", "%" + nameFilter.toUpperCase() + "%");
              if(produto.getMarca() != null && produto.getMarca().getId() != null){
                query.setParameter("idMarca", produto.getMarca().getId());
              }
              
              if(produto.getDetalhe() != null && produto.getDetalhe().getId() != null){
                    query.setParameter("idDetalhe", produto.getDetalhe().getId());
              }
            
            
            query.setMaxResults(1);

            try {
                return (Produto) query.getSingleResult();
            } catch (Exception ex) {
                 if (!(ex instanceof NoResultException)) {
                    ex.printStackTrace();
                }
                return null;
            }
      }
    
      public Produto findProdutoByName(String nameFilter) {
            String sql = "SELECT p FROM Produto p WHERE p.name LIKE :name";

            Query query = getEntityManager().createQuery(sql);

            query.setParameter("name", "%" + nameFilter.toUpperCase() + "%");

            query.setMaxResults(1);

            try {
                return (Produto) query.getSingleResult();
            } catch (Exception ex) {
                 if (!(ex instanceof NoResultException)) {
                    ex.printStackTrace();
                }
                return null;
            }
      }

      private List<Produto> findProdutoEntities(String nameFilter) {
          String sql = "SELECT p FROM Produto p ";

        if (!MyStringUtil.isNullOrEmpty(nameFilter)) {
            sql += " WHERE p.name LIKE :name ";
        }

        sql += " ORDER BY p.name";

        EntityManager em = getEntityManager();

        try {
            Query query = em.createQuery(sql);

            if (!MyStringUtil.isNullOrEmpty(nameFilter)) {

                    query.setParameter("name", "%" + nameFilter.toUpperCase() + "%");

            }

            return query.getResultList();
        } catch (Exception ex) {
            ex.printStackTrace();
            return new ArrayList<Produto>();
        } 
      }
      
      
      public List<Produto> findProdutoEntities(int maxResults, int firstResult, String nameFilter) {
        return findProdutoEntities(false, maxResults, firstResult, nameFilter);
      }


      private List<Produto> findProdutoEntities(boolean all, int maxResults, int firstResult, String nameFilter) {
       System.out.println(">>>>>>>> Entrou findProdutoEntities....");
          String sql = "SELECT p FROM Produto p ";

        if (!MyStringUtil.isNullOrEmpty(nameFilter)) {
            System.out.println(">>>>>>>> Entrou no if MyStringUtil....");
            sql += " WHERE p.name LIKE :name ";
        }

        sql += " ORDER BY p.name";

        EntityManager em = getEntityManager();

        try {
            Query query = em.createQuery(sql);

            if (!MyStringUtil.isNullOrEmpty(nameFilter)) {

                    query.setParameter("name", "%" + nameFilter.toUpperCase() + "%");

            }

            if (!all) {
                query.setMaxResults(maxResults);
                query.setFirstResult(firstResult);
            }

            return query.getResultList();
        } catch (Exception ex) {
            ex.printStackTrace();
            return new ArrayList<Produto>();
        } 
    }

    public Long countProdutoEntities(String nameFilter) {
         System.out.println(">>>>>>>> Entrou countProdutoEntities....");
        String sql = "SELECT COUNT(p) FROM Produto p ";

        if (!MyStringUtil.isNullOrEmpty(nameFilter)) {
                 System.out.println(">>>>>>>> Entrou no if MyStringUtil do count....");
            sql += " WHERE p.name LIKE :name ";
        }
        
        EntityManager em = getEntityManager();

        try {
            Query query = em.createQuery(sql);

            if (!MyStringUtil.isNullOrEmpty(nameFilter)) {
               query.setParameter("name", "%" + nameFilter.toUpperCase() + "%");
            }

            return (Long) query.getSingleResult();
        } catch (Exception ex) {
            ex.printStackTrace();
            return 0l;
        } 
    }

     public List<Produto> findProdutoForName(String nameFilter) {
        
        String sql = "SELECT p FROM Produto p ";
           
           if (!MyStringUtil.isNullOrEmpty(nameFilter)) {
              sql += " WHERE p.name LIKE :name ";
           }
            sql += " ORDER BY p.name";
        Query query = getEntityManager().createQuery(sql);

            if (!MyStringUtil.isNullOrEmpty(nameFilter)) {
               query.setParameter("name", "%" + nameFilter.toUpperCase() + "%");
            }
        
        try {
            return query.getResultList();
        } catch (Exception ex) {
            ex.printStackTrace();
            return new ArrayList<Produto>();
        }
    }

    public List<Produto> findProdutoAjaxName(String nameFilter, int max_results) {
        String sql = "SELECT p FROM Produto p WHERE p.name LIKE :name";

        Query query = getEntityManager().createQuery(sql);

        query.setParameter("name", "%" + nameFilter.toUpperCase() + "%");

        query.setMaxResults(max_results);

        try {
            return query.getResultList();
        } catch (Exception ex) {
            ex.printStackTrace();
            return new ArrayList<Produto>();
        }
    }

    public List<Produto> findProdutoEntities() {
        return findProdutoEntities(true, -1, -1);
    }

    public List<Produto> findProdutoEntities(int maxResults, int firstResult) {
        return findProdutoEntities(false, maxResults, firstResult);
    }

    private List<Produto> findProdutoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Produto.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Produto findProduto(Long id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Produto.class, id);
        } finally {
            em.close();
        }
    }

    public int getProdutoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Produto> rt = cq.from(Produto.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
